home *** CD-ROM | disk | FTP | other *** search
- <?xml version="1.0"?>
-
- <bindings id="feedreaderBindings"
- xmlns="http://www.mozilla.org/xbl"
- xmlns:html="http://www.w3.org/1999/xhtml"
- xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- xmlns:xbl="http://www.mozilla.org/xbl">
-
- <binding id="feedreader" extends="xul:box">
- <content>
- <xul:toolbaritem id="feedreader">
- <xul:image id="feedreader-left-cap" />
- <xul:button tooltiptext="Toggle News Sidebar" id="feedreader-sidebar-toggle" oncommand="toggleFeedSidebar()"/>
- <xul:button tooltiptext="Reload Feed" id="feedreader-reload" xbl:inherits="hidden=hidereloadbutton" oncommand="readFeed()"/>
- <xul:button tooltiptext="Previous Item" id="feedreader-previous" oncommand="previousFeedItem()"/>
- <xul:button tooltiptext="Next Item" id="feedreader-next" oncommand="nextFeedItem()"/>
- <xul:button id="feedreader-feedname" xbl:inherits="hidden=hidefeedname" oncommand="nextFeed()"/>
- <xul:hbox id="feedreader-textbox" disabled="true" xbl:inherits="width">
- <xul:deck id="feedreader-deck" min-width="100" flex="1" crop="end">
- <xul:hbox>
- <xul:label id="feedreader-loading" value="Loading..." />
- </xul:hbox>
- </xul:deck>
- </xul:hbox>
- <xul:image id="feedreader-right-cap" />
- </xul:toolbaritem>
- <children includes="btfeed" />
- </content>
- <handlers>
- <handler event="command">
- <![CDATA[
- if (event.originalTarget.hasAttribute("url")) {
- var subject = {};
- subject.wrappedJSObject = this.brandObject;
- this.observerService.notifyObservers(subject, "brandthunder", this.id);
- this.brandObject.utilities.openLink(this.brandObject, event, event.originalTarget.getAttribute("url"));
- }
- ]]>
- </handler>
- </handlers>
- <implementation>
- <constructor>
- <![CDATA[
- if (this.childNodes.length) {
- for (var i=0; i < this.childNodes.length; i++) {
- this.feeds.push(this.childNodes[i].getAttribute('src'));
- }
- if (this.childNodes.length == 1 ) {
- document.getAnonymousElementByAttribute(this, 'id', 'feedreader-feedname').setAttribute('disabled', true);
- }
- } else {
- return;
- }
-
- this.observerService = Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService)
-
- var title = this.childNodes[0].getAttribute('title');
- if (title) {
- document.getAnonymousElementByAttribute(this, 'id', 'feedreader-feedname').label = title;
- } else {
- document.getAnonymousElementByAttribute(this, 'id', 'feedreader-feedname').hidden = true;
- }
- if (this.hasAttribute('brand')) {
- this.brandObject = BrandThunder.clients[this.getAttribute('brand')];
- }
- if (this.hasAttribute('numitems')) {
- this.numitems = this.getAttribute('numitems');
- }
- if (this.hasAttribute('rotationdelay')) {
- this.rotationdelay = this.getAttribute('rotationdelay') * 1000;
- }
- if (this.hasAttribute('itemtitleprefix')) {
- this.itemtitleprefix = this.getAttribute('itemtitleprefix');
- }
- if (this.hasAttribute('itemurlprefix')) {
- this.itemurlprefix = this.getAttribute('itemurlprefix');
- }
- if (this.hasAttribute('sidebar')) {
- this.sidebarID = this.getAttribute('sidebar');
- document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('observes', this.sidebarID);
- } else {
- document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('hidden', true);
- }
-
- this.readFeed(this.selectedIndex);
- function reloadFeed(feedreader) {
- return function() {
- feedreader.readFeed(0, feedreader);
- }
- }
- this.reloadTimer = window.setInterval(reloadFeed(this), this.reloaddelay);
- ]]>
- </constructor>
- <destructor>
- window.clearInterval(this.rotationTimer);
- window.clearInterval(this.reloadTimer);
- </destructor>
- <field name="feeds">
- [];
- </field>
- <field name="feedItems">
- [];
- </field>
- <field name="numitems">
- -1;
- </field>
- <field name="feedIndex">
- 0;
- </field>
- <field name="selectedIndex">
- 0;
- </field>
- <field name="rotationdelay">
- 5000;
- </field>
- <field name="reloaddelay">
- 1800000;
- </field>
- <field name="itemtitleprefix">
- "";
- </field>
- <field name="itemurlprefix">
- "";
- </field>
- <field name="currentFeedTitle">
- "";
- </field>
- <field name="currentFeedURL">
- "";
- </field>
- <field name="rssdeckElement">
- document.getAnonymousElementByAttribute(this, 'id', 'feedreader-deck');
- </field>
- <field name="rotationTimer">
- </field>
- <field name="reloadTimer">
- </field>
- <field name="readSrcTimer">
- </field>
- <field name="sidebarID">
- ""
- </field>
- <field name="brandObject"/>
- <field name="observerService"/>
-
-
- <method name="toggleFeedSidebar">
- <body>
- <![CDATA[
- if (this.sidebarID) {
- toggleSidebar(this.sidebarID);
- }
- ]]>
- </body>
- </method>
-
- <method name="startFeedRotation">
- <body>
- <![CDATA[
- var deckLength = this.rssdeckElement.childNodes.length;
- window.clearInterval(this.rotationTimer);
- function advance(feedreader) {
- return function() {
- feedreader.nextFeedItem();
- }
- }
- this.rotationTimer = window.setInterval(advance(this), this.rotationdelay);
- ]]>
- </body>
- </method>
- <method name="previousFeedItem">
- <body>
- <![CDATA[
- this.startFeedRotation();
- var deckLength = this.rssdeckElement.childNodes.length;
-
- var selectedIndex = parseInt(this.rssdeckElement.getAttribute('selectedIndex'));
- if (selectedIndex > 0) {
- this.rssdeckElement.setAttribute('selectedIndex', selectedIndex - 1);
- } else {
- this.rssdeckElement.setAttribute('selectedIndex', deckLength - 1);
- }
-
- ]]>
- </body>
- </method>
-
- <method name="nextFeedItem">
- <body>
- <![CDATA[
- this.startFeedRotation();
- var deckLength = this.rssdeckElement.childNodes.length;
-
- var selectedIndex = parseInt(this.rssdeckElement.getAttribute('selectedIndex'));
- if (selectedIndex < deckLength - 1) {
- this.rssdeckElement.setAttribute('selectedIndex', selectedIndex + 1);
- } else {
- this.rssdeckElement.setAttribute('selectedIndex', 0);
- }
-
- ]]>
- </body>
- </method>
- <method name="nextFeed">
- <body>
- <![CDATA[
- window.clearInterval(this.rotationTimer);
- this.feedIndex++;
- if (this.feedIndex == this.childNodes.length) {
- this.feedIndex = 0;
- }
-
- var title = this.childNodes[this.feedIndex].getAttribute('title');
-
- if (title) {
- document.getAnonymousElementByAttribute(this, 'id', 'feedreader-feedname').label = title;
- }
-
- this.readFeed();
-
- ]]>
- </body>
- </method>
- <method name="readFeed">
- <parameter name="index" />
- <parameter name="feedreader" />
- <body>
- if (!feedreader) {
- feedreader = this;
- }
- <![CDATA[
- if (!index) {
- index = feedreader.feedIndex;
- }
- feedreader.feedItems = [];
-
- var xhr = new XMLHttpRequest();
- xhr.open('GET', feedreader.feeds[index], true);
- xhr.onload = function() {
- feedreader.parseFeed(xhr.responseText);
- }
- xhr.send(null);
- ]]>
- </body>
- </method>
- <method name="parseFeed">
- <parameter name="xml" />
- <body>
- <![CDATA[
- var parser = new DOMParser();
- var dom = parser.parseFromString(xml, 'text/xml');
-
- // check for error
- if (dom.documentElement.nodeName == 'parsererror')
- throw new Error('Could not parse feed');
-
- var xmlDoc = dom.documentElement;
- switch (xmlDoc.nodeName.toLowerCase()) {
- case 'feed': this.parseAtom(xmlDoc); break;
- case 'rdf:rdf': this.parseRss(xmlDoc); break;
- case 'rss': this.parseRss(xmlDoc); break;
- }
-
- this.loadFeedDisplay();
-
- ]]>
- </body>
- </method>
-
- <method name="loadFeedDisplay">
- <body>
- <![CDATA[
- for (var deckChildren = this.rssdeckElement.childNodes.length - 1; deckChildren >= 0; deckChildren--) {
- this.rssdeckElement.removeChild(this.rssdeckElement.childNodes.item(deckChildren));
- }
-
- var numFeedItems = this.feedItems.length;
- if (this.numitems > 0) {
- numFeedItems = this.numitems;
- }
- for (var i = 0; i < numFeedItems; i++) {
- var tempButton = document.createElement('toolbarbutton');
- tempButton.setAttribute('crop', 'end');
- tempButton.setAttribute('pack', 'start');
- tempButton.setAttribute('label', this.itemtitleprefix + this.feedItems[i]['title']);
- tempButton.setAttribute('tooltiptext', this.feedItems[i]['title']);
- tempButton.setAttribute('crop', 'end');
- tempButton.setAttribute('flex', '2');
-
- // Set the link
- if (this.itemurlprefix) {
- var url = this.itemurlprefix + escape(this.feedItems[i]['url']).replace(/\'/g, "\\\'" );
- } else {
- var url = this.feedItems[i]['url'];
- }
- tempButton.setAttribute('url', url);
-
- this.rssdeckElement.appendChild(tempButton);
- }
-
- this.rssdeckElement.setAttribute('selectedIndex', 0);
-
- this.startFeedRotation();
-
-
- ]]>
- </body>
- </method>
-
- <method name="parseAtom">
- <parameter name="xmlDoc" />
- <body>
- <![CDATA[
- var kids = xmlDoc.childNodes;
- for (var i = 0; i < kids.length; i++) if (kids[i].nodeName == 'title') {
- this.currentFeedTitle = kids[i].textContent;
- break;
- }
- for (var i = 0; i < kids.length; i++) if (kids[i].nodeName == 'link') {
- var rel = kids[i].getAttribute('rel');
- if (rel == null || rel == 'alternate') {
- this.currentFeedURL = kids[i].getAttribute('href');
- break;
- }
- }
-
- var entries = xmlDoc.getElementsByTagName('entry');
- for (var i = 0; i < entries.length; i++) {
- this.feedItems[i] = ['title', 'url'];
-
- //load the entry title
- this.feedItems[i]['title'] = entries[i].getElementsByTagName('title')[0].firstChild.nodeValue;
-
- //if <id> is an absolute URL, use that
- var elem = entries[i].getElementsByTagName('id');
- for (var j = 0; j < elem.length; j++) {
- var kids = elem[j].childNodes;
- if (kids.length > 0) {
- var val = kids[0].nodeValue;
- if (val != null && val.match(/^http:\/\//)) {
- this.feedItems[i]['url'] = val;
- break;
- }
- }
- }
-
-
- //instead look for a <link> tag
- if (this.feedItems[i]['url'] == null) {
- var elem = entries[i].getElementsByTagName('link');
- for (var j = 0; j < elem.length; j++) {
- var rel = elem[j].getAttribute('rel');
- if (rel == null || rel == 'alternate') {
- this.feedItems[i]['url'] = elem[j].getAttribute('href');
- break;
- }
- }
- }
-
- if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
- throw new Error('Invalid feed');
- }
-
- ]]>
- </body>
- </method>
- <method name="parseRss">
- <parameter name="xmlDoc" />
- <body>
- <![CDATA[
- var channels = xmlDoc.getElementsByTagName('channel');
- if (channels.length > 0) {
- var kids = channels[0].childNodes;
- for (var i = 0; i < kids.length; i++) if (kids[i].nodeName == 'title') {
- this.currentFeedTitle = kids[i].textContent;
- break;
- }
- for (var i = 0; i < kids.length; i++) if (kids[i].nodeName == 'link') {
- this.currentFeedURL = kids[i].textContent;
- break;
- }
- }
-
- var items = xmlDoc.getElementsByTagName('item');
- for (var i = 0; i < items.length; i++) {
- this.feedItems[i] = ['title', 'url', 'content'];
-
- var titleElem = items[i].getElementsByTagName('title');
- if (titleElem.length > 0)
- this.feedItems[i]['title'] = titleElem[0].textContent;
-
- var linkElem = items[i].getElementsByTagName('link');
- if (linkElem.length > 0)
- this.feedItems[i]['url'] = linkElem[0].textContent;
-
- if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
- throw new Error('Invalid feed');
- }
- ]]>
- </body>
- </method>
- </implementation>
- </binding>
-
- <binding id="feed"></binding>
- </bindings>
-